#include <vcl.h>
#pragma hdrstop

#include "CPostes.h"

#pragma package(smart_init)

#define MODULE_TAG 13



/*
  Le constructeur prend les nom des répertoires ou trouver les fichiers BTrieve.

  CheminDesPostesAModifier : chemin des postes à modifier (sans '\\' final)
  AModifierAvecRevAO : TRUE si les fichiers à modifier commencent par RevAO (ex : RevAO$$P.dat)
  CheminDesPostesAReprendre : chemin des postes de référence (sans '\\' final)
  AReprendreAvecRevAO : TRUE si les fichiers de référence commencent par RevAO (ex : RevAO$$P.dat)
*/
__fastcall CPostes::CPostes(const AnsiString &CheminDesPostesAModifier,bool AModifierAvecRevAO)
{
  char cChemin[256];
  AnsiString Chemin;
  GetShortPathName(CheminDesPostesAModifier.c_str(),cChemin,255);
  Chemin = AnsiString(cChemin);
  Chemin = Chemin + (Chemin[Chemin.Length()] == '\\' ? "" : "\\") + (AModifierAvecRevAO ? "RevAO" : "");
  TblP_Commun = Chemin + "$$P.dat";
  Tbl0_Commun = Chemin + "$$0.dat";
  Tbl1_Commun = Chemin + "$$1.dat";
  Tbl2_Commun = Chemin + "$$2.dat";
  FichierPExistant = FileExists(TblP_Commun);
  Fichier0Existant = FileExists(Tbl0_Commun);
  Fichier1Existant = FileExists(Tbl1_Commun);
  Fichier2Existant = FileExists(Tbl2_Commun);
}



__fastcall CPostes::~CPostes()
{
  if (Commun_P.IsOpened)
    Commun_P.Close(TAGL);
  if (Fichier0Existant && Commun_0.IsOpened)
    Commun_0.Close(TAGL);
  if (Fichier1Existant && Commun_1.IsOpened)
    Commun_1.Close(TAGL);
  if (Fichier2Existant && Commun_2.IsOpened)
    Commun_2.Close(TAGL);
}



bool __fastcall CPostes::Open()
{
  int Resultat;
  try
    {
      Resultat = Ouverture_Commun_P;
      if (FichierPExistant)
          Commun_P.Open(TAGL,BTRV_RW,sizeof(PosteCriteres),TblP_Commun);
      Resultat = Ouverture_Commun_0;
      if (Fichier0Existant)
          Commun_0.Open(TAGL,BTRV_RW,sizeof(PosteRacine),Tbl0_Commun);
      Resultat = Ouverture_Commun_1;
      if (Fichier1Existant)
          Commun_1.Open(TAGL,BTRV_RW,sizeof(PosteRacine),Tbl1_Commun);
      if (Fichier2Existant)
        {
          Resultat = Ouverture_Commun_2;
          Commun_2.Open(TAGL,BTRV_RW,sizeof(PosteCriteresANouveaux),Tbl2_Commun);
        }
      Resultat = AucuneErreur;
    }
  catch (Exception &e)
    {
      AnsiString Fichier;
      switch (Resultat)
        {
          case Ouverture_Commun_P:
            Fichier = TblP_Commun;
            break;
          case Ouverture_Commun_0:
            Fichier = Tbl0_Commun;
            break;
          case Ouverture_Commun_1:
            Fichier = Tbl1_Commun;
            break;
          case Ouverture_Commun_2:
            Fichier = Tbl2_Commun;
            break;
          default:
            Fichier = "????";
        }
      EICErreur(EICFormat("Erreur d'ouverture du fichier\n%s",Fichier.c_str()));
      EICDisplayException(TAGL,e);
    }
  return (Resultat == AucuneErreur);
}



void __fastcall CPostes::Close()
{
  Commun_P.Close(TAGL);
  if (Fichier0Existant)
    Commun_0.Close(TAGL);
  if (Fichier1Existant)
    Commun_1.Close(TAGL);
  if (Fichier2Existant)
    Commun_2.Close(TAGL);
}


bool __fastcall CPostes::SupprimerPostes(TStringList *ListeDesPostes)
{
  int Position,Resultat;
  try
    {
      if (Fichier2Existant)
        {
          Resultat = Suppression_Poste_Commun_2;
          if (Commun_2.GetFirst(TAGL,&ANouveau,&ANouveau.eIDPoste,0))
            do
              {
                Position = ListeDesPostes->IndexOf(AnsiString(ANouveau.eIDPoste));
                if (Position >= 0)
                  Commun_2.DelCurrent(TAGL);       //On supprime le poste dans le $$2
              }
            while (Commun_2.GetNext(TAGL,&ANouveau,&ANouveau.eIDPoste,0));
        }
      if (Fichier1Existant)
        {
          Resultat = Suppression_Poste_Commun_1;
          if (Commun_1.GetFirst(TAGL,&Compte,&Compte.eIDPoste,0))
            do
              {
                Position = ListeDesPostes->IndexOf(AnsiString(Compte.eIDPoste));
                if (Position >= 0)
                  Commun_1.DelCurrent(TAGL);       //On supprime le poste dans le $$1
              }
            while (Commun_1.GetNext(TAGL,&Compte,&Compte.eIDPoste,0));
        }
      if (Fichier0Existant)
        {
          Resultat = Suppression_Poste_Commun_0;
          if (Commun_0.GetFirst(TAGL,&Compte,&Compte.eIDPoste,0))
            do
              {
                Position = ListeDesPostes->IndexOf(AnsiString(Compte.eIDPoste));
                if (Position >= 0)
                  Commun_0.DelCurrent(TAGL);       //On supprime le poste dans le $$0
              }
            while (Commun_0.GetNext(TAGL,&Compte,&Compte.eIDPoste,0));
        }
      Resultat = Suppression_Poste_Commun_P;
      if (FichierPExistant)
        {
          if (Commun_P.GetFirst(TAGL,&Poste,&Poste.eIDGroupe,1))
            do
              {
                Position = ListeDesPostes->IndexOf(AnsiString(Poste.eIDPoste));
                if (Position >= 0)
                  Commun_P.DelCurrent(TAGL);       //On supprime le poste dans le $$P
              }
            while (Commun_P.GetNext(TAGL,&Poste,&Poste.eIDGroupe,1));
        }
      Resultat = AucuneErreur;
    }
  catch(Exception &e)
    {
      AnsiString Fichier;
      switch (Resultat)
        {
          case Suppression_Poste_Commun_P:
            Fichier = TblP_Commun;
            break;
          case Suppression_Poste_Commun_0:
            Fichier = Tbl0_Commun;
            break;
          case Suppression_Poste_Commun_1:
            Fichier = Tbl1_Commun;
            break;
          case Suppression_Poste_Commun_2:
            Fichier = Tbl2_Commun;
            break;
          default:
            Fichier = "????";
        }
      EICErreur(EICFormat("Erreur de création dans le fichier\n%s",Fichier.c_str()));
      EICDisplayException(TAGL,e);
    }
  return (Resultat == AucuneErreur);
}

bool __fastcall CPostes::GetValeursPoste(unsigned short NumeroPoste,PosteCriteres &Criteres)
{
  int Resultat;
  if (!FichierPExistant) return true;

  ASSERT(!TblP_Commun.IsEmpty());

  try
    {
      Resultat = GetValeursCommun;
      Criteres.eIDPoste = NumeroPoste;
      if (!Commun_P.GetEQ(TAGL,&Criteres,&Criteres.eIDPoste,0))
        memset(&Criteres,0,sizeof(PosteCriteres));
      Resultat = AucuneErreur;
    }
  catch(Exception &e)
    {
      AnsiString Fichier;
      switch (Resultat)
        {
          case GetValeursCommun:
            Fichier = TblP_Commun;
            break;
          default:
            Fichier = "????";
        }
      EICErreur(EICFormat("Erreur de lecture dans le fichier\n"
                          "%s",Fichier.c_str()));
      EICDisplayException(TAGL,e);
    }
  return (Resultat == AucuneErreur);
}



bool __fastcall CPostes::SetValeursPoste(unsigned short NumeroPoste,const PosteCriteres &Criteres)
{
  int Resultat;
  PosteCriteres Poste;
  if (!FichierPExistant) return true;

  ASSERT(!TblP_Commun.IsEmpty());

  try
    {
      Resultat = SetValeursCommun;
      Poste.eIDPoste = NumeroPoste;
      if (Commun_P.GetEQ(TAGL,&Poste,&Poste.eIDPoste,0))
        Commun_P.UpdateCurrent(TAGL,&Criteres);
      Resultat = AucuneErreur;
    }
  catch(Exception &e)
    {
      AnsiString Fichier;
      switch (Resultat)
        {
          case SetValeursCommun:
            Fichier = TblP_Commun;
            break;
          default:
            Fichier = "????";
        }
      EICErreur(EICFormat("Erreur d'écriture dans le fichier\n"
                          "%s",Fichier.c_str()));
      EICDisplayException(TAGL,e);
    }
  return (Resultat == AucuneErreur);
}



